package com.asen.commons.core.jdbc;

import com.asen.commons.core.jdbc.builder.SqlBuilder;
import com.asen.commons.core.jdbc.param.ParamStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.rowset.SqlRowSet;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * Jdbc接口
 *
 * @author Gary
 * @version 1.0
 * @date 2018-11-09
 */
public interface Jdbc {

    /**
     * 获取数据源.
     *
     * @return 获得的数据源
     */
    DataSource getDataSource();

    /**
     * 设置数据源
     *
     * @param dataSource
     */
    void setDataSource(DataSource dataSource);

    /**
     * 用于执行任意增删改操作
     *
     * @param builder
     * @return
     */
    int update(SqlBuilder builder);

    /**
     * 用于执行任意增删改操作
     *
     * @param sql
     * @return
     */
    int update(String sql);

    /**
     * 通用SQL查询
     *
     * @param sql
     * @return
     * @throws Exception
     */
    List<Map<String, Object>> query(String sql);

    /**
     * 返回指定类型
     *
     * @param sql
     * @param elementType
     * @param <T>
     * @return
     * @throws Exception
     */
    <T> List<T> query(String sql, Class<T> elementType);

    /**
     * 通过rowMapper构建
     *
     * @param sql
     * @param rowMapper
     * @param <T>
     * @return
     * @throws Exception
     */
    <T> List<T> query(String sql, RowMapper<T> rowMapper);

    /**
     * 查询
     *
     * @param sql
     * @param rse
     * @param <T>
     * @return
     * @throws Exception
     */
    <T> List<T> query(final String sql, final ResultSetExtractor<List<T>> rse);

    <T> List<T> query(SqlBuilder builder, final ResultSetExtractor<List<T>> rse);

    SqlRowSet queryForRowSet(String sql);

    SqlRowSet queryForRowSet(String sql, ParamStatementSetter pss);

    /**
     * 用于执行DDL脚本
     *
     * @param sql
     */
    void execute(final String sql);

    /**
     * 批量执行DDL脚本
     */
    int[] batchUpdate(String... sql);
}
